package org.xmap.ui.control;
import javax.microedition.lcdui.Graphics;
import org.xmap.app.Env;
import org.xmap.ui.UIUtil;
import org.xmap.ui.View;
import org.xmap.ui.base.Event;
import org.xmap.ui.base.Window;
public final class PointerKeyboard extends Window {
    /**
     * 文本的颜色。
     */
    protected int textColor;
    /**
     * 边框的颜色。
     */
    protected int lineColor;
    /**
     * 是否显示边框。
     */
    protected boolean drawRect;
    /**
     * 是否是透明，如果透明，将不会显示背景颜色。
     */
    protected boolean transparent;
    /**
     * 一个键的宽度和高度。
     */
    protected int cell;
    /**
     * 绘制触笔键盘的x方向偏移。
     */
    protected int xOffset;
    /**
     * 绘制触笔键盘的y方向偏移。
     */
    protected int yOffset;
    /**
     * 按键监听器。
     */
    protected View keyListener;
    /**
     * 指定按键监听器、触笔键盘锚点坐标、宽度、高度、锚点类型的构造函数。
     * @param keyListener Window 按键监听器。
     * @param x int 锚点横坐标。
     * @param y int 锚点纵坐标。
     * @param width int 锚点宽度。
     * @param height int 锚点高度。
     * @param orient int 锚点类型。
     */
    public PointerKeyboard(View keyListener, int x, int y, int width, int height, int orient) {
        super(x, y, width, height, orient);
        this.textColor = 0xff000000;
        this.lineColor = 0xff000000;
        this.drawRect = true;
        this.transparent = false;
        this.cell = Math.min((width / 10) - 1, height - 2);
        this.xOffset = (width - this.cell * 10) >> 1;
        this.yOffset = (this.getRect().height - this.cell + 1) >> 1;
        this.keyListener = keyListener;
    }
    /**
     * 重新设置窗口的区域。
     * @param leftUpX int 窗口左上角坐标。
     * @param leftUpY int 窗口右上角坐标。
     * @param width int 窗口宽度。
     * @param height int 窗口高度。
     */
    public void setRect(int leftUpX, int leftUpY, int width, int height) {
        super.setRect(leftUpX, leftUpY, width, height);
        this.xOffset = (width - this.cell * 10) >> 1;
        this.yOffset = (this.getRect().height - this.cell + 1) >> 1;
    }
    /**
     * 设置文字的颜色。
     * @param color int 文字的颜色。
     */
    public void setTextColor(int color) {
        this.textColor = color;
    }
    /**
     * 获得文字的颜色。
     * @return int 文字的颜色。
     */
    public int getTextColor() {
        return this.textColor;
    }
    /**
     * 设置边框的颜色。
     * @param lineColor int 获得边框的颜色。
     */
    public void setLineColor(int lineColor) {
        this.lineColor = lineColor;
    }
    /**
     * 获得边框的颜色。
     * @return int 边框的颜色。
     */
    public int getLineColor() {
        return this.lineColor;
    }
    /**
     * 设置是否绘制边框。
     * @param isDrawRect boolean 是否绘制边框。
     */
    public void setDrawRect(boolean isDrawRect) {
        this.drawRect = isDrawRect;
    }
    /**
     * 获得是否绘制边框。
     * @return boolean 是否绘制边框。
     */
    public boolean getDrawRect() {
        return this.drawRect;
    }
    /**
     * 设置触笔键盘是否为透明，透明的意思是不用背景颜色填充背景。
     * @param transparent boolean 是否透明。
     */
    public void setTransparent(boolean transparent) {
        this.transparent = transparent;
    }
    /**
     * 获得触笔键盘是否为透明。
     * @return boolean 是否透明。
     */
    public boolean getTransparent() {
        return this.transparent;
    }
    /**
     * 绘制函数。
     * @param g Graphics 图形句柄。
     */
    public void draw(Graphics g) {
//        if (!this.show) {
//            return;
//        }
        g.setFont(Env.instance.defaultFont);
        if (!this.transparent) {
            g.setColor(this.bgColor);
            g.fillRect(0, 0, this.getRect().width, this.getRect().height);
        }
        if (this.bgImage != null) {
            for (int i = 0; i < this.getRect().width; i += this.bgImage.getWidth()) {
                g.drawImage(this.bgImage, i, 0, Graphics.LEFT | Graphics.TOP);
            }
        }
        g.translate(this.xOffset, 0);
        for (int i = 0; i < 10; i++) {
            g.setColor(this.lineColor);
            g.drawRect(i * this.cell, this.yOffset, this.cell - 1, this.cell - 1);
            g.setColor(this.textColor);
//            g.drawString("" + i, i * this.cell + (this.cell >> 1), this.cell - this.fontYOffset,
//                         Graphics.HCENTER | Graphics.BOTTOM);
            UIUtil.draw(g, String.valueOf(i),
                              i * this.cell + (this.cell >> 1), this.getRect().height >> 1,
                              Graphics.HCENTER, Graphics.VCENTER);
        }
        g.translate( -this.xOffset, 0);
        if (this.drawRect) {
            g.setColor(this.lineColor);
            g.drawRect(0, 0, this.getRect().width - 1, this.getRect().height - 1);
        }
    }
    /**
     * 触笔事件处理函数，在触笔键盘内的触笔事件都被处理。
     * @param ev Event 触笔事件。
     * @return boolean 是否处理该事件。
     */
    public boolean pointerEvent(Event ev) {
//        if (!this.show || !this.enable) {
//            return false;
//        }
        boolean result = false;
        switch (ev.type) {
        case Event.POINTER_PRESSED:
            System.out.println("press:" + ev.param1 + " " + ev.param2);
            if (this.getRect().collideWith(ev.param1, ev.param2)) {
//                this.isPointerSelected = true;
                super.setPointerSelected(true);
                this.pointerPressedY = ev.param2; // 记录触笔的垂直位置
                int x = ev.param1 - this.getRect().leftUp.x - this.xOffset;
                int y = ev.param2 - this.getRect().leftUp.y - this.yOffset;
                if (y > 0 && y < this.cell) {
                    int value = x / this.cell;
                    if (this.keyListener != null) {
                        this.keyListener.keyEvent(true, value + '0', 0);
                    }
                }
                result = true;
            }
            break;
        case Event.POINTER_RELEASED:
            if (this.getRect().collideWith(ev.param1, ev.param2)) {
                result = true;
            }
            break;
        case Event.POINTER_DRAGGED:
            if (this.getRect().collideWith(ev.param1, ev.param2)) {
                result = true;
            }
            break;
        }
        return result;
    }
}
